package gui;

import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import java.awt.CardLayout;
import datos.DatosDelJuego;
import logica.Adivinador;
import logica.Estadisticas;
import java.awt.Rectangle;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;

public class VentanaAdivinador {

	/** Declaracion de la parte logica del juego. **/
	public Adivinador adivino;
	public Estadisticas estadisticas;

	/** Declaracion de la parte grafica del juego. **/
	public Personaje personaje;
	public JPanel panelPrincipal;
	public PanelBanner panelBanner;
	public PanelInicio panelInicio;
	public PanelPreguntas panelPreguntas;
	public PanelRespuesta panelRespuesta;
	public PanelEstadisticas panelEstadisticas;
	public PanelEntrenar panelEntrenar;
	public PanelEleccion panelEleccion;
	public CardLayout cards;

	private JFrame frame;
	private PanelImagen panelBase;
	private ControlCentral controlCentral;

	/** Construye el juego. */
	public VentanaAdivinador() {

		crearLogica();
		controlCentral = new ControlCentral(this);
		crearFrame();
		crearBase();
		crearPrincipal();
		crearPersonaje();
		crearBanner();
	}

	/** Inicia y carga la logica del juego. **/
	private void crearLogica() {
		adivino = new Adivinador(DatosDelJuego.recuperarArbolDeAtributos());
		estadisticas = new Estadisticas(DatosDelJuego.recuperarEstadisticas());
	}

	/** Construye el panel que aloja las diferentes vistas. **/
	private void crearPrincipal() {

		panelPrincipal = new JPanel();
		panelPrincipal.setBounds(12, 94, 822, 520);
		panelPrincipal.setOpaque(false);

		cards = new CardLayout(0, 0);
		panelPrincipal.setLayout(cards);

		panelInicio = new PanelInicio();
		panelInicio.setActionListener(controlCentral);
		panelPrincipal.add(panelInicio, "panelInicio");

		panelPreguntas = new PanelPreguntas();
		panelPreguntas.setActionListener(controlCentral);
		panelPrincipal.add(panelPreguntas, "panelPreguntas");

		panelRespuesta = new PanelRespuesta();
		panelRespuesta.setActionListener(controlCentral);
		panelPrincipal.add(panelRespuesta, "panelRespuesta");

		panelEstadisticas = new PanelEstadisticas();
		panelEstadisticas.setActionListener(controlCentral);
		panelPrincipal.add(panelEstadisticas, "panelEstadisticas");

		panelEntrenar = new PanelEntrenar();
		panelEntrenar.setActionListener(controlCentral);
		panelPrincipal.add(panelEntrenar, "panelEntrenar");

		panelEleccion = new PanelEleccion();
		panelEleccion.setActionListener(controlCentral);
		panelPrincipal.add(panelEleccion, "panelEleccion");
		panelBase.add(panelPrincipal);
	}

	private void crearBanner() {
		panelBanner = new PanelBanner();
		panelBanner.setBounds(12, 12, 822, 124);
		panelBase.add(panelBanner);
	}

	private void crearPersonaje() {
		JPanel panelPersonaje = new JPanel();
		panelPersonaje.setBounds(12, 94, 380, 520);
		panelPersonaje.setOpaque(false);
		panelPersonaje.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
		personaje = new Personaje();
		personaje.definirGesto(Personaje.gesto.YEAH);
		panelPersonaje.add(personaje);
		panelBase.add(panelPersonaje);
	}

	/** Construye el panel Base con una imagen de fondo. **/
	private void crearBase() {
		panelBase = new PanelImagen("img/paneles/fondo.png");
		panelBase.setLayout(null);
		frame.getContentPane().add(panelBase, BorderLayout.CENTER);
	}

	/** Construye la ventana. **/
	private void crearFrame() {
		frame = new JFrame();
		frame.setMinimumSize(new Dimension(850, 650));
		frame.setSize(new Dimension(925, 736));
		frame.setPreferredSize(new Dimension(850, 650));
		frame.getContentPane().setCursor(
				Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
		frame.setBounds(new Rectangle(100, 100, 850, 650));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(new BorderLayout(0, 0));
		frame.setResizable(false);
	}

	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaAdivinador window = new VentanaAdivinador();
					window.frame.setVisible(true);

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}
